Este análisis tiene como objetivo calcular probabilidades condicionales en el dataset de IMDb, respondiendo preguntas como:
¿Cuál es la probabilidad de que una película con alto presupuesto tenga una alta recaudación?
¿Cómo influye el género de la película en su calificación (score)?
¿Qué tan probable es que una película de cierto país tenga un presupuesto alto?
Estos cálculos permiten entender patrones en la industria del cine y su relación con el presupuesto, la recaudación y las calificaciones.
install.packages("here",dependencies = TRUE)
library(here) # Manejo de rutas dinámicas
source(here("reportes/Proy_Imdb/00_CONFIGURACION.r"))
# 📌 Cargar librerías necesarias
library(janitor) # Limpieza de nombres de columnas
library(summarytools) # Resumen estadístico detallado
library(ggplot2) # Gráficos
library(dplyr) # Manipulación de datos
library(plotly) # Gráficos Interactivos
# 📌 Configuración de gráficos globales
theme_set(theme_minimal())
# 📌 Cargar scripts de preprocesamiento
source(here("scripts/utils.r"))
source(here("scripts/1_preprocesamiento_esp_dataset.r"))
source(here("scripts/3_analisis_probabilidad.r"))
📌 ¿Qué hace esta función?
✔ Limpia los nombres de las columnas.
✔ Convierte variables categóricas en factores.
✔ Filtra valores inválidos.
✔ Retorna un dataset listo para análisis.
# 📌 Cargar y preprocesar el dataset IMDb
imdb_data <- preprocesar_datos(here("datasets/imdb_data_limpio.csv"), "Imdb")
## 📥 Cargando datos del proyecto: Imdb
## 🧹 Realizando limpieza de datos...
## 📊 Aplicando preprocesamiento específico para IMDb...
## ✅ Preprocesamiento completado para: Imdb
# Filtrar géneros con más de 50 películas
imdb_filtered <- imdb_data %>%
group_by(genre) %>%
filter(n() > 50) %>%
ungroup()
En esta sección analizamos la relación entre presupuesto, recaudación, género y calificación de películas aplicando cálculos de probabilidad condicional.
📌 Probabilidad de que una película con alto presupuesto tenga alta recaudación
# 📌 Definir los bins para cada variable
bins_budget <- seq(0, max(imdb_filtered$budget_x, na.rm = TRUE), by = 50000000) # Intervalos de $50M
bins_revenue <- seq(0, max(imdb_filtered$revenue, na.rm = TRUE), by = 100000000) # Intervalos de $100M
# 📌 Transformar los datos antes de calcular probabilidades
imdb_data_binned <- imdb_filtered %>%
filter(budget_x > 0, revenue > 0) %>% # Eliminamos valores nulos
mutate(
budget_x = cut(budget_x, breaks = bins_budget, include.lowest = TRUE),
revenue = cut(revenue, breaks = bins_revenue, include.lowest = TRUE)
)
# 📌 Calcular la probabilidad condicional de recaudación dado el presupuesto
resultados_budget_vs_revenue <- calcular_probabilidades(
data = imdb_data_binned,
condicionante = "budget_x",
objetivo = "revenue"
)
# 📌 Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_budget_vs_revenue$tabla_contingencia)
## # A tibble: 55 × 3
## budget_x revenue n
## <fct> <fct> <int>
## 1 [0,5e+07] [0,1e+08] 1475
## 2 [0,5e+07] (1e+08,2e+08] 233
## 3 [0,5e+07] (2e+08,3e+08] 90
## 4 [0,5e+07] (3e+08,4e+08] 44
## 5 [0,5e+07] (4e+08,5e+08] 16
## 6 [0,5e+07] (5e+08,6e+08] 7
## 7 [0,5e+07] (6e+08,7e+08] 8
## 8 [0,5e+07] (7e+08,8e+08] 1
## 9 (5e+07,1e+08] [0,1e+08] 69
## 10 (5e+07,1e+08] (1e+08,2e+08] 76
## # ℹ 45 more rows
cat("\nProbabilidades condicionales:\n")
##
## Probabilidades condicionales:
print(resultados_budget_vs_revenue$probabilidades_condicionales)
## # A tibble: 55 × 4
## budget_x revenue n prob_condicional
## <fct> <fct> <int> <dbl>
## 1 [0,5e+07] [0,1e+08] 1475 0.787
## 2 [0,5e+07] (1e+08,2e+08] 233 0.124
## 3 [0,5e+07] (2e+08,3e+08] 90 0.0480
## 4 [0,5e+07] (3e+08,4e+08] 44 0.0235
## 5 [0,5e+07] (4e+08,5e+08] 16 0.00854
## 6 [0,5e+07] (5e+08,6e+08] 7 0.00374
## 7 [0,5e+07] (6e+08,7e+08] 8 0.00427
## 8 [0,5e+07] (7e+08,8e+08] 1 0.000534
## 9 (5e+07,1e+08] [0,1e+08] 69 0.0844
## 10 (5e+07,1e+08] (1e+08,2e+08] 76 0.0929
## # ℹ 45 more rows
cat("\nProbabilidades marginales de recaudación:\n")
##
## Probabilidades marginales de recaudación:
print(resultados_budget_vs_revenue$probabilidades_marginales)
## # A tibble: 18 × 3
## revenue n prob_marginal
## <fct> <int> <dbl>
## 1 [0,1e+08] 1575 0.444
## 2 (1e+08,2e+08] 440 0.124
## 3 (2e+08,3e+08] 303 0.0854
## 4 (3e+08,4e+08] 362 0.102
## 5 (4e+08,5e+08] 273 0.0769
## 6 (5e+08,6e+08] 233 0.0657
## 7 (6e+08,7e+08] 176 0.0496
## 8 (7e+08,8e+08] 78 0.0220
## 9 (8e+08,9e+08] 50 0.0141
## 10 (9e+08,1e+09] 31 0.00874
## 11 (1e+09,1.1e+09] 8 0.00225
## 12 (1.1e+09,1.2e+09] 3 0.000846
## 13 (1.2e+09,1.3e+09] 3 0.000846
## 14 (1.3e+09,1.4e+09] 1 0.000282
## 15 (1.5e+09,1.6e+09] 8 0.00225
## 16 (1.6e+09,1.7e+09] 1 0.000282
## 17 (1.7e+09,1.8e+09] 1 0.000282
## 18 <NA> 2 0.000564
# Calcular probabilidades
resultados_genre_vs_score <- calcular_probabilidades(
data = imdb_filtered,
condicionante = "genre",
objetivo = "score",
bins = 10 # Dividimos la calificación en 5 grupos
)
# 📌 Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_genre_vs_score$tabla_contingencia)
## # A tibble: 185 × 3
## genre score n
## <fct> <fct> <int>
## 1 Action [-0.1,10] 1
## 2 Action (20,30] 1
## 3 Action (30,40] 1
## 4 Action (40,50] 3
## 5 Action (50,60] 35
## 6 Action (60,70] 40
## 7 Action (70,80] 5
## 8 Action, Comedy [-0.1,10] 1
## 9 Action, Comedy (30,40] 1
## 10 Action, Comedy (40,50] 3
## # ℹ 175 more rows
cat("\nProbabilidades condicionales:\n")
##
## Probabilidades condicionales:
print(resultados_genre_vs_score$probabilidades_condicionales)
## # A tibble: 185 × 4
## genre score n prob_condicional
## <fct> <fct> <int> <dbl>
## 1 Action [-0.1,10] 1 0.0116
## 2 Action (20,30] 1 0.0116
## 3 Action (30,40] 1 0.0116
## 4 Action (40,50] 3 0.0349
## 5 Action (50,60] 35 0.407
## 6 Action (60,70] 40 0.465
## 7 Action (70,80] 5 0.0581
## 8 Action, Comedy [-0.1,10] 1 0.0182
## 9 Action, Comedy (30,40] 1 0.0182
## 10 Action, Comedy (40,50] 3 0.0545
## # ℹ 175 more rows
cat("\nProbabilidades marginales de score:\n")
##
## Probabilidades marginales de score:
print(resultados_genre_vs_score$probabilidades_marginales)
## # A tibble: 10 × 3
## score n prob_marginal
## <fct> <int> <dbl>
## 1 [-0.1,10] 124 0.0348
## 2 (10,20] 25 0.00701
## 3 (20,30] 22 0.00617
## 4 (30,40] 54 0.0151
## 5 (40,50] 225 0.0631
## 6 (50,60] 859 0.241
## 7 (60,70] 1361 0.382
## 8 (70,80] 799 0.224
## 9 (80,90] 89 0.0250
## 10 (90,100] 9 0.00252
# Filtrar los 5 países con más películas en la base de datos
top_countries <- imdb_filtered %>%
count(country, sort = TRUE) %>%
top_n(5) %>%
pull(country)
# Filtrar dataset con los países seleccionados
imdb_filtered_country <- imdb_filtered %>%
filter(country %in% top_countries)
# Calcular probabilidades
resultados_country_vs_budget <- calcular_probabilidades(
data = imdb_filtered_country,
condicionante = "country",
objetivo = "budget_x",
bins = 5
)
# 📌 Mostrar resultados
cat("Tabla de contingencia:\n")
## Tabla de contingencia:
print(resultados_country_vs_budget$tabla_contingencia)
## # A tibble: 20 × 3
## country budget_x n
## <fct> <fct> <int>
## 1 AU [-3.4e+05,6.8e+07] 1163
## 2 AU (6.8e+07,1.36e+08] 222
## 3 AU (1.36e+08,2.04e+08] 37
## 4 AU (2.04e+08,2.72e+08] 4
## 5 ES [-3.4e+05,6.8e+07] 32
## 6 ES (6.8e+07,1.36e+08] 52
## 7 ES (1.36e+08,2.04e+08] 6
## 8 ES (2.04e+08,2.72e+08] 3
## 9 FR [-3.4e+05,6.8e+07] 45
## 10 FR (6.8e+07,1.36e+08] 51
## 11 FR (1.36e+08,2.04e+08] 11
## 12 FR (2.04e+08,2.72e+08] 1
## 13 KR [-3.4e+05,6.8e+07] 60
## 14 KR (6.8e+07,1.36e+08] 105
## 15 KR (1.36e+08,2.04e+08] 79
## 16 US [-3.4e+05,6.8e+07] 598
## 17 US (6.8e+07,1.36e+08] 348
## 18 US (1.36e+08,2.04e+08] 81
## 19 US (2.04e+08,2.72e+08] 12
## 20 US (2.72e+08,3.4e+08] 1
cat("\nProbabilidades condicionales:\n")
##
## Probabilidades condicionales:
print(resultados_country_vs_budget$probabilidades_condicionales)
## # A tibble: 20 × 4
## country budget_x n prob_condicional
## <fct> <fct> <int> <dbl>
## 1 AU [-3.4e+05,6.8e+07] 1163 0.816
## 2 AU (6.8e+07,1.36e+08] 222 0.156
## 3 AU (1.36e+08,2.04e+08] 37 0.0259
## 4 AU (2.04e+08,2.72e+08] 4 0.00281
## 5 ES [-3.4e+05,6.8e+07] 32 0.344
## 6 ES (6.8e+07,1.36e+08] 52 0.559
## 7 ES (1.36e+08,2.04e+08] 6 0.0645
## 8 ES (2.04e+08,2.72e+08] 3 0.0323
## 9 FR [-3.4e+05,6.8e+07] 45 0.417
## 10 FR (6.8e+07,1.36e+08] 51 0.472
## 11 FR (1.36e+08,2.04e+08] 11 0.102
## 12 FR (2.04e+08,2.72e+08] 1 0.00926
## 13 KR [-3.4e+05,6.8e+07] 60 0.246
## 14 KR (6.8e+07,1.36e+08] 105 0.430
## 15 KR (1.36e+08,2.04e+08] 79 0.324
## 16 US [-3.4e+05,6.8e+07] 598 0.575
## 17 US (6.8e+07,1.36e+08] 348 0.335
## 18 US (1.36e+08,2.04e+08] 81 0.0779
## 19 US (2.04e+08,2.72e+08] 12 0.0115
## 20 US (2.72e+08,3.4e+08] 1 0.000962
cat("\nProbabilidades marginales de presupuesto:\n")
##
## Probabilidades marginales de presupuesto:
print(resultados_country_vs_budget$probabilidades_marginales)
## # A tibble: 5 × 3
## budget_x n prob_marginal
## <fct> <int> <dbl>
## 1 [-3.4e+05,6.8e+07] 1898 0.652
## 2 (6.8e+07,1.36e+08] 778 0.267
## 3 (1.36e+08,2.04e+08] 214 0.0735
## 4 (2.04e+08,2.72e+08] 20 0.00687
## 5 (2.72e+08,3.4e+08] 1 0.000344
p_budget_vs_revenue <- visualizar_probabilidad_condicional(
data = imdb_data_binned,
condicionante = "budget_x",
objetivo = "revenue",
titulo = "Probabilidad de Recaudación según Presupuesto en IMDb",
xlab = "Presupuesto (USD)",
guardar = TRUE,
ruta_guardado = here("reportes/Proy_Imdb/resultados_generados/probabilidad_condicional_budget_vs_revenue.png"),
bins = bins_budget
)
p_budget_vs_revenue <- p_budget_vs_revenue %>%
layout(xaxis = list(tickangle = 90)) # Rotar etiquetas del eje X a 90 grados
# Mostrar el gráfico con etiquetas rotadas
p_budget_vs_revenue
# Filtrar géneros con al menos 50 películas
filtered_genres <- imdb_filtered %>%
group_by(genre) %>%
filter(n() > 250) %>%
ungroup()
# Generar el gráfico con los géneros filtrados
p_genre_vs_score <- visualizar_probabilidad_condicional(
data = filtered_genres,
condicionante = "genre",
objetivo = "score",
titulo = "Probabilidad de Género según Calificación en IMDb",
xlab = "Género",
guardar = TRUE,
ruta_guardado = here("reportes/Proy_Imdb/resultados_generados/probabilidad_condicional_genre_vs_score.png"),
bins=10
) %>% layout(xaxis = list(tickangle = 90)) # Aplicar la rotación
# Mostrar el gráfico corregido
p_genre_vs_score
p_country_vs_budget <- visualizar_probabilidad_condicional(
data = imdb_filtered_country,
condicionante = "country",
objetivo = "budget_x",
titulo = "Probabilidad de Presupuesto según País en IMDb",
xlab = "País",
guardar = TRUE,
ruta_guardado = here("reportes/Proy_Imdb/resultados_generados/probabilidad_condicional_country_vs_budget.png"),
bins=10
)
p_country_vs_budget